import fitz  # PyMuPDF
from PIL import Image, ImageDraw, ImageFont
import io
import os
import random
import shutil  # 新增导入

def create_text_image(text, font_path, fontsize=16, text_color=(255, 0, 0), scale=4):
    # 生成高清文字图片
    font = ImageFont.truetype(font_path, fontsize * scale)
    dummy_img = Image.new("RGB", (1, 1))
    draw = ImageDraw.Draw(dummy_img)
    bbox = draw.textbbox((0, 0), text, font=font)
    w = bbox[2] - bbox[0]
    h = bbox[3] - bbox[1]

    img = Image.new("RGBA", (w + 10 * scale, h + 10 * scale), (255, 255, 255, 0))
    draw = ImageDraw.Draw(img)
    draw.text((5 * scale, 5 * scale), text, font=font, fill=text_color + (255,))
    return img, w, h


def insert_score_and_comment_with_image(pdf_path, output_path, score, comment, font_path):
    doc = fitz.open(pdf_path)
    scale = 4
    has_match = False

    for page in doc:
        colon_variants = ["成绩:", "成绩：", "成绩: ", "成绩： "]
        text_instances = []
        for variant in colon_variants:
            text_instances.extend(page.search_for(variant))
        if text_instances:
            has_match = True
            for inst in text_instances:
                # 插入分数
                score_pos = fitz.Point(inst.x1 + 10, inst.y0 + 10)
                page.insert_text(score_pos, str(score), fontsize=20, color=(1, 0, 0))

                # 创建评语图像
                img, w, h = create_text_image(comment, font_path, fontsize=4, text_color=(255, 0, 0), scale=scale)
                img_byte_arr = io.BytesIO()
                img.save(img_byte_arr, format='PNG')
                img_byte_arr = img_byte_arr.getvalue()

                # 设置插入位置
                comment_x = inst.x0 - 350
                comment_y = inst.y1
                rect = fitz.Rect(comment_x, comment_y, comment_x + w, comment_y + h)
                page.insert_image(rect, stream=img_byte_arr)

    if has_match:
        doc.save(output_path)
        print(f"保存成功：{output_path}")
        doc.close()
        return 1

    else:
        print(f"未找到“成绩:”关键词，跳过处理：{pdf_path}")
        doc.close()
        return 0



def deal_oen(pdf_path, output_path, comment, score):
    font_path = "./SourceHanSansSC-Regular.otf"  # 请确保这个字体文件存在

    return insert_score_and_comment_with_image(
        pdf_path=pdf_path,
        output_path=output_path,
        score=score,
        comment=comment,
        font_path=font_path
    )


import os
import random

def batch_process_pdfs(
    input_dir,
    output_dir,
    good_comments,
    bad_comments,
    good_student_names,
    good_score_range=(97, 99),
    bad_score_range=(94, 96),
    unprocessed_dir=None
):
    os.makedirs(output_dir, exist_ok=True)

    if unprocessed_dir:  # 如果提供了未处理文件的目录，则创建它
        os.makedirs(unprocessed_dir, exist_ok=True)

    results = []

    for filename in os.listdir(input_dir):
        if filename.endswith(".pdf"):
            pdf_path = os.path.join(input_dir, filename)
            output_path = os.path.join(output_dir, filename)

            # 提取学生名字
            name_part = filename.split("_")[-1]
            student_name = name_part.replace(".pdf", "")

            if student_name in good_student_names:
                score = random.randint(*good_score_range)
                comment = random.choice(good_comments)
            else:
                score = random.randint(*bad_score_range)
                comment = random.choice(bad_comments)

            # 插入处理
            result_flag = deal_oen(pdf_path, output_path, comment, score)

            if result_flag == 0:
                score = 0
                # 如果处理失败，复制到未处理目录
                if unprocessed_dir:
                    shutil.copy(pdf_path, os.path.join(unprocessed_dir, filename))

            results.append((student_name, score))

    return results




# 示例用法
if __name__ == "__main__":
    input_dir = "/Users/anyi/Desktop/2/第七章实验报告"  # 原始PDF文件夹路径
    output_dir = "/Users/anyi/Desktop/2/out/第七章实验报告"  # 输出文件夹路径
    unprocessed_dir = "/Users/anyi/Desktop/2/out/第七章实验报告/未处理"
    comments_better = [
        (
            "数据记录清晰、完整，处理过程规范，步骤清晰。实验过程中准确记录了各项数据，\n"
            "分析时考虑到各可能误差来源并做出合理解释。深入分析实验结果，\n"
            "能够从多个角度解读数据与理论的契合度，且结果与理论高度一致，分析全面。\n"
            "语言规范，格式整洁，实验报告结构清晰，逻辑严密，文献引用规范。\n"
        ),
        (
            "数据记录细致，实验过程严谨，所有变量和控制条件均有详细记录，并进行精确处理。\n"
            "分析深刻，能从理论与实验结果的角度充分探讨，给出了有价值的结论，\n"
            "并结合相关理论进行了对比。格式正确，表格、图表清晰、整洁，语言简练，\n"
            "表达清晰，体现出严谨的学术态度。\n"
        ),
        (
            "数据全面且规范，处理步骤有条不紊，图表清晰、易于理解。分析透彻，\n"
            "能结合理论提出合理的解释，并对比相关研究结果，得出创新性的结论。\n"
            "报告书写规范，图表引用准确，格式符合要求，表述简洁明了，符合学术标准。\n"
        ),
        (
            "数据详实准确，处理步骤得当，误差分析合理，实验数据具有较高的可信度。\n"
            "实验结果的分析深入，与相关理论结合紧密，能够提炼出实验背后的规律，\n"
            "得出的结论具有实际意义。书写规范，实验报告结构清晰，段落分明，\n"
            "语法和拼写无误，符合学术写作要求。\n"
        ),
        (
            "数据记录准确，处理方法科学，数据处理与分析方法合理且有效，\n"
            "结果有高度的可靠性。分析全面、深刻，能结合理论提出创新观点，\n"
            "对比实验结果与理论假设，解释到位，具有很好的可读性。格式规范，语言流畅，\n"
            "结构清晰，数据与结果展示符合要求，报告书写具有较高的学术水平。\n"
        )
    ]

    comments_middle = [
        (
            "数据记录较为完整，处理过程基本合理，但在细节处理上略有不够完善之处。\n"
            "分析较为表面，部分结果未能与理论深入结合，缺乏深度和广度。\n"
            "写整体规范，但在格式和表达上偶尔存在小问题，部分段落衔接不够流畅。\n"
        ),
        (
            "数据记录较为清晰，但数据处理过程中部分细节处理不够细致，\n"
            "存在一定的误差来源。结果分析尚可，但理论与实验的结合不够紧密，\n"
            "分析较为简单。书写规范性较好，部分地方有小的格式错误，语言流畅，\n"
            "但需要进一步改进。\n"
        ),
        (
            "数据记录基本完整，但部分数据处理步骤不够清晰，\n"
            "实验过程中有个别环节记录不够细致。实验结果分析较为简单，\n"
            "与理论结合的深度不足，结果解释较为表面，缺少全面性。报告书写较为规范，\n"
            "但在格式和表述上存在些许问题，整体结构较为简单。\n"
        ),
        (
            "数据记录清晰，但在处理过程中忽略了某些细节，\n"
            "导致部分数据的处理不够完善。分析较为粗略，虽然有对结果的解释，\n"
            "但与相关理论的结合不够深入，分析深度和广度有所欠缺。\n"
            "书写符合基本规范，但有少许格式或语法错误，结构上尚可，未达到优秀标准。\n"
        ),
        (
            "数据记录较为准确，部分数据处理步骤清晰，个别步骤仍显得略显草率，\n"
            "可能影响结果的准确性。分析较为基础，能够理解实验现象，\n"
            "但未能充分挖掘实验背后的深层次原因，缺少全面性。格式规范性一般，\n"
            "部分部分缺少详细描述，报告中存在一些语言不够简练、表达不够清晰的情况。\n"
        )
    ]
    good_student_name = [
        "张三", "李四", "王五", "赵六", "孙七", "周八", "吴九",
        "郑十", "钱一", "冯二", "陈三", "褚四", "卫五",
        "蒋六", "沈七", "韩八", "杨九"
    ]
    result_list = batch_process_pdfs(input_dir, output_dir, comments_better, comments_middle,good_student_names=good_student_name,unprocessed_dir = unprocessed_dir)

    # 打印所有成绩
    for name, score in result_list:
        print(f"{name}: {score}")

    # 可选：保存为CSV文件
    with open(os.path.join(output_dir,"score_list.csv"), "w", encoding="utf-8") as f:
        f.write("姓名,分数\n")
        for name, score in result_list:
            f.write(f"{name},{score}\n")




